home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue30 / datalink / ComponentDatalink.pas
Encoding:
Pascal/Delphi Source File  |  1997-11-27  |  5.7 KB  |  211 lines

  1. unit ComponentDataLink;
  2.  
  3. interface
  4.  
  5. uses
  6.   DB, DBTables, BDE, Classes;
  7.  
  8. type
  9.   TComponentDataLink = class(TDataLink)
  10.   private
  11.     fComponent: TComponent;
  12.     fDataSet: TDataSet;
  13.     fDataSetName: string;
  14.     fIndexNames: string;
  15.     fOnNewDataSet: TDataSetNotifyEvent;
  16.     fOnDataSetOpen: TDataSetNotifyEvent;
  17.     fOnDataSetChange: TDataSetNotifyEvent;
  18.     fOnIndexChange: TDataSetNotifyEvent;
  19.     fOnLayoutChange: TDataSetNotifyEvent;
  20.     fOnPostData: TDataSetNotifyEvent;
  21.     fOnDataSetClose: TDataSetNotifyEvent;
  22.     fOnInvalidDataSet: TDataSetNotifyEvent;
  23.     fOnInvalidDataSource: TDataSetNotifyEvent;
  24.     fOnDestroyDataLink: TDataSetNotifyEvent;
  25.   protected
  26.     function GetDataSetName: string; virtual;
  27.     procedure SetDataSetName(Value: string); virtual;
  28.     procedure ActiveChanged; override;
  29.     procedure CheckBrowseMode; override;
  30.     procedure DataSetChanged; override;
  31.     procedure DataSetScrolled(Distance: Integer); override;
  32.     procedure FocusControl(Field: TFieldRef); override;
  33.     procedure EditingChanged; override;
  34.     procedure LayoutChanged; override;
  35.     procedure RecordChanged(Field: TField); override;
  36.     procedure UpdateData; override;
  37.   public
  38.     constructor Create(AComponent: TComponent); virtual;
  39.     destructor Destroy; override;
  40.     property DataSetName: string
  41.              read GetDataSetName
  42.              write SetDataSetName;
  43.     property OnNewDataSet: TDataSetNotifyEvent
  44.              read fOnNewDataSet
  45.              write fOnNewDataSet;
  46.     property OnDataSetOpen: TDataSetNotifyEvent
  47.              read fOnDataSetOpen
  48.              write fOnDataSetOpen;
  49.     property OnDataSetChange: TDataSetNotifyEvent
  50.              read fOnDataSetChange
  51.              write fOnDataSetChange;
  52.     property OnIndexChange: TDataSetNotifyEvent
  53.              read fOnIndexChange
  54.              write fOnIndexChange;
  55.     property OnLayoutChange: TDataSetNotifyEvent
  56.              read fOnLayoutChange
  57.              write fOnLayoutChange;
  58.     property OnPostData: TDataSetNotifyEvent
  59.              read fOnPostData
  60.              write fOnPostData;
  61.     property OnDataSetClose: TDataSetNotifyEvent
  62.              read fOnDataSetClose
  63.              write fOnDataSetClose;
  64.     property OnInvalidDataSet: TDataSetNotifyEvent
  65.              read fOnInvalidDataSet
  66.              write fOnInvalidDataSet;
  67.     property OnInvalidDataSource: TDataSetNotifyEvent
  68.              read fOnInvalidDataSource
  69.              write fOnInvalidDataSource;
  70.     property OnDestroyDataLink: TDataSetNotifyEvent
  71.              read fOnDestroyDataLink
  72.              write fOnDestroyDataLink;
  73.   end;
  74.  
  75. implementation
  76.  
  77. constructor TComponentDataLink.Create(AComponent: TComponent);
  78. begin
  79.   inherited Create;
  80.   fComponent := AComponent;
  81. end;
  82.  
  83. destructor TComponentDataLink.Destroy;
  84. begin
  85.   if Assigned(fOnDestroyDataLink) then
  86.     fOnDestroyDataLink(DataSet);
  87.   inherited Destroy;
  88. end;
  89.  
  90. function TComponentDataLink.GetDataSetName: string;
  91. begin
  92.   Result := fDataSetName;
  93.   if DataSet <> nil then
  94.     Result := DataSet.Name;
  95.   if DataSet is TTable then
  96.     Result := TTable(DataSet).TableName;
  97.   if DataSet is TQuery then
  98.     if DataSet.DataSource <> nil then
  99.       Result := TTable(TQuery(DataSet).DataSource.DataSet).TableName;
  100. end;
  101.  
  102. procedure TComponentDataLink.SetDataSetName(Value: string);
  103. begin
  104.   if fDataSetName <> Value then
  105.     fDataSetName := Value;
  106. end;
  107.  
  108. procedure TComponentDataLink.ActiveChanged;
  109. begin
  110.   if Active then
  111.   begin
  112.     fDataSet := DataSet;
  113.     if DataSetName <> fDataSetName then
  114.     begin
  115.       fDataSetName := DataSetName;
  116.       fIndexNames := TTable(fDataSet).IndexFieldNames;
  117.       if Assigned(fOnNewDataSet) then
  118.         fOnNewDataSet(DataSet);
  119.     end
  120.     else
  121.     begin
  122.       fIndexNames := TTable(DataSet).IndexFieldNames;
  123.       if Assigned(fOnDataSetOpen) then
  124.         fOnDataSetOpen(DataSet);
  125.     end;
  126.   end
  127.   else
  128.   begin
  129.     if DataSet = nil then
  130.     begin
  131.       if Assigned(fOnInvalidDataSource) then
  132.         fOnInvalidDataSource(fDataSet);
  133.       fDataSet := nil;
  134.       fDataSetName := '<INVALID>';
  135.       fIndexNames := '';
  136.     end
  137.     else
  138.     begin
  139.       if (csDestroying in DataSet.ComponentState) then
  140.       begin
  141.         if Assigned(fOnInvalidDataSet) then
  142.           fOnInvalidDataSet(fDataSet);
  143.         fDataSet := nil;
  144.         fDataSetName := '<INVALID>';
  145.         fIndexNames := '';
  146.       end
  147.       else
  148.       begin
  149.         if Assigned(fOnDataSetClose) then
  150.           fOnDataSetClose(DataSet);
  151.         if DataSet <> nil then
  152.         begin
  153.           fDataSetName := DataSetName;
  154.           fIndexNames := TTable(DataSet).IndexFieldNames;
  155.         end;
  156.       end;
  157.     end;
  158.   end;
  159. end;
  160.  
  161. procedure TComponentDataLink.CheckBrowseMode;
  162. begin
  163.  
  164. end;
  165.  
  166. procedure TComponentDataLink.DataSetChanged;
  167. begin
  168.   if TTable(DataSet).IndexFieldNames <> fIndexNames then
  169.   begin
  170.     fIndexNames := TTable(DataSet).IndexFieldNames;
  171.     if Assigned(fOnIndexChange) then
  172.       fOnIndexChange(DataSet);
  173.   end
  174.   else
  175.     if Assigned(fOnDataSetChange) then
  176.       fOnDataSetChange(DataSet);
  177. end;
  178.  
  179. procedure TComponentDataLink.DataSetScrolled(Distance: Integer);
  180. begin
  181.  
  182. end;
  183.  
  184. procedure TComponentDataLink.FocusControl(Field: TFieldRef);
  185. begin
  186.  
  187. end;
  188.  
  189. procedure TComponentDataLink.EditingChanged;
  190. begin
  191.  
  192. end;
  193.  
  194. procedure TComponentDataLink.LayoutChanged;
  195. begin
  196.   if Assigned(fOnLayoutChange) then
  197.     fOnLayoutChange(DataSet);
  198. end;
  199.  
  200. procedure TComponentDataLink.RecordChanged(Field: TField);
  201. begin
  202.  
  203. end;
  204.  
  205. procedure TComponentDataLink.UpdateData;
  206. begin
  207.  
  208. end;
  209.  
  210. end.
  211.